Projekt z Analizy Danych - Siłownia

Aleksandra Ochocińska

Mateusz Wasiewski

Adam Sienkiewicz

Wprowadzenie

1. Wstęp

2. Zmienne w zbiorze danych

Wiek - wiek użytkownika siłowni.

Płeć - płeć użytkownika siłowni.

Waga - waga użytkownika siłowni w kilogramach.

Wzrost - wzrost użytkownika siłowni w metrach

Max_BPM - maksymalne tętno podczas sesji treningowych.

Avg_BPM - średnie tętno podczas sesji treningowych.

Resting_BPM - tętno w spoczynku przed treningiem.

Session_Duration - czas trwania każdej sesji treningowej w godzinach.

Calories_Burned - całkowita liczba kalorii spalonych podczas każdej sesji.

Workout_Type - rodzaj wykonanego treningu (np. kardio, siłowy, joga, HIIT).

Fat_Percentage -procent tkanki tłuszczowej.

Water_Intake - dzienne spożycie wody podczas treningu w litrach.

Workout_Frequency - liczba sesji treningowych w tygodniu.

Experience_Level - poziom doświadczenia, od początkującego (1) do eksperta (3).

BMI - wskaźnik masy ciała, obliczany na podstawie wzrostu i wagi.

3. Struktura danych

1. Liczba kolumn oraz wierszy

## Liczba wierszy: 973
## Liczba kolumn: 15

Zbiór danych siłownia posiada 973 wiersze oraz 15 kolumn.

2. Statystki opisowe poszczególnych kolumn

##       Age           Gender           Weight (kg)       Height (m)   
##  Min.   :18.00   Length:973         Min.   : 40.00   Min.   :1.500  
##  1st Qu.:28.00   Class :character   1st Qu.: 58.10   1st Qu.:1.620  
##  Median :39.00   Mode  :character   Median : 70.00   Median :1.710  
##  Mean   :38.63                      Mean   : 73.85   Mean   :1.723  
##  3rd Qu.:50.00                      3rd Qu.: 86.00   3rd Qu.:1.800  
##  Max.   :59.00                      Max.   :129.90   Max.   :2.000  
##  NA's   :100                                                        
##     Max_BPM         Avg_BPM       Resting_BPM    Session_Duration (hours)
##  Min.   :160.0   Min.   :120.0   Min.   :50.00   Min.   :0.500           
##  1st Qu.:170.0   1st Qu.:131.0   1st Qu.:56.00   1st Qu.:1.040           
##  Median :180.0   Median :143.0   Median :62.00   Median :1.260           
##  Mean   :179.9   Mean   :143.8   Mean   :62.22   Mean   :1.256           
##  3rd Qu.:190.0   3rd Qu.:156.0   3rd Qu.:68.00   3rd Qu.:1.460           
##  Max.   :199.0   Max.   :169.0   Max.   :74.00   Max.   :2.000           
##                                                                          
##  Calories_Burned  Workout_Type       Fat_Percentage  Water_Intake (liters)
##  Min.   : 303.0   Length:973         Min.   :10.00   Min.   :1.500        
##  1st Qu.: 720.0   Class :character   1st Qu.:21.30   1st Qu.:2.200        
##  Median : 893.0   Mode  :character   Median :26.20   Median :2.600        
##  Mean   : 905.4                      Mean   :24.98   Mean   :2.627        
##  3rd Qu.:1076.0                      3rd Qu.:29.30   3rd Qu.:3.100        
##  Max.   :1783.0                      Max.   :35.00   Max.   :3.700        
##                                                                           
##  Workout_Frequency (days/week) Experience_Level      BMI       
##  Min.   :2.000                 Min.   :1.00     Min.   :12.32  
##  1st Qu.:3.000                 1st Qu.:1.00     1st Qu.:20.11  
##  Median :3.000                 Median :2.00     Median :23.94  
##  Mean   :3.322                 Mean   :1.81     Mean   :24.82  
##  3rd Qu.:4.000                 3rd Qu.:2.00     3rd Qu.:28.45  
##  Max.   :5.000                 Max.   :3.00     Max.   :47.72  
##                                                 NA's   :150

4. Wstępne przygotowanie danych

1. Pobranie i zainstalowanie niezbędnych pakietów

2. Zmiana nazw kolumn

Weight (kg) -> Weight_kg

Height (m) -> Height_m

Session_Duration (hours) -> Session_Duration_hours

Water_Intake (liters) -> Water_Intake_liters

Workout_Frequency (days/week) -> Workout_Frequency_daysweek

Data Wrangling

1. Obserwacje odstające

2. Analiza braków danych

Analiza braków danych jest kluczowym etapem przygotowania zbioru danych do dalszej analizy. W ramach tego procesu określimy liczbę braków w zbiorze, przeanalizujemy ich rozmieszczenie oraz sprawdzimy, czy występują korelacje między brakami w różnych zmiennych. Wyniki tej analizy posłużą jako podstawa do podjęcia decyzji o dalszym postępowaniu z brakującymi danymi.

Wstępna analiza braków danych

Sprawdzenie gdzie występują braki danych i procentowo ile ich jest

W całej bazie danych brakuje 2,7% danych.

Braki danych występują w kolumnie Workout_Type, Age oraz BMI.

Ile braków jest w poszczególnych kolumnach

Kolumna Age ma 100 braków.

Kolumna Workout_Type ma 150 braków.

Kolumna BMI ma 150 braków.

Występowanie braków w wierszach

Liczba NA w wierszu Liczba wierszy Procent wszystkich wierszy
0 631 64,85%
1 287 29,50%
2 52 5,34%
3 3 0,31%

631 wierszy ma 0 NA

287 wierszy ma 1 NA

  • 115 w Workout_Type

  • 106 w BMI

  • 66 w Age

52 wiersze ma 2 NA

  • 21 wierszy w Workout_Type i BMI

  • 20 wierszy w Age i BMI

  • 11 w Age i Workout_Type

3 wiersze mają 3 NA

Sprawdzanie korelacji między brakami danych

1. Age i BMI

Braki w kolumnie BMI są całkowicie niezależne od wartości w kolumnie Age.

Z kolei braki w kolumnie Age są raczej niezależne od wartości BMI, choć zauważono nieco większą liczbę braków w przypadku niższych wartości BMI.

2. Workout_Type i BMI

Braki w kolumnie BMI są całkowicie niezależne od wartości w kolumnie Workout_Type.

Z kolei braki w kolumnie Workout_Type są raczej niezależne od wartości BMI, choć zauważono nieco większą liczbę braków w przypadku niższych wartości BMI.

3. Workout_Type i Age

Braki w obu kolumnach są całkowicie niezależne od siebie.

3. Imputacja braków danych

W procesie analizy braków danych napotkaliśmy na brakujące wartości (NA) w kolumnach Age, BMI oraz Workout_Type. Aby zapewnić spójność i pełność danych, postanowiliśmy przeprowadzić imputację braków, czyli zastąpienie brakujących wartości odpowiednimi danymi.

Kolumna BMI

Braki w kolumnie postanowaliśmy zastąpić za pomocą wzoru na BMI

\[ BMI = \frac{waga}{wzrost^2} \]

silownia$BMI <- ifelse(
  is.na(silownia$BMI),  
  silownia$Weight_kg / (silownia$Height_m^2),  
  silownia$BMI )


Kolumna Workout_Type i Age

W przypadku kolumnt Workout_Type i Age zdecydowaliśmy przeprowadzić imputację na kilka sposób, a następnie wybrać najlepszą możliwość.

1. Imputacja metodą k-Nearest Neighbors (kNN)

silownia_kNN <- kNN(silownia, k = 3)

2. Imputacja z pakietem Mice

{r message=FALSE, warning=FALSE}
if (!is.factor(silownia$Workout_Type)) {
  silownia$Workout_Type <- factor(silownia$Workout_Type, levels = c("Yoga", "Cardio", "HIIT", "Strength"))
}

metody <- make.method(silownia)

metody["Age"] <- "pmm"
metody["Workout_Type"] <- "polyreg"
metody["BMI"] <- "" 

pred_mat <- make.predictorMatrix(silownia)
pred_mat["BMI", ] <- 0 # Wyłącz imputację dla BMI
pred_mat[, "BMI"] <- 1 # BMI jako predyktor dla innych kolumn

silownia_imp <- mice(silownia, m = 5, method = metody, predictorMatrix = pred_mat, seed = 123)

lm_imp <- with(silownia_imp, lm(BMI ~ Weight_kg + Gender))
lm_pooled <- pool(lm_imp)

summary(lm_pooled, conf.int = TRUE, conf.level = 0.95)

stripplot(silownia_imp, BMI ~ Weight_kg | .imp, pch = 20, cex = 2)

silownia_mice <- complete(silownia_imp, action = 1)

3. Imputacja hot-deck

silownia_hotdeck <- hotdeck(silownia)

4. Imputacja RPART

silownia_rpart  <- silownia  %>%
  mutate(Workout_Type = case_when(
    Workout_Type == "Yoga" ~ 1,
    Workout_Type == "Cardio" ~ 2,
    Workout_Type == "HIIT" ~ 3,
    Workout_Type == "Strength" ~ 4,
    TRUE ~ as.numeric(Workout_Type) 
  ))

silownia_rpart <- silownia_rpart %>%
  mutate(Gender = case_when(
    Gender == "Male" ~ 1,
    Gender == "Female" ~ 2,
    TRUE ~ as.numeric(Gender) 
  ))


drzewo_decyzyjne1 <- rpart(Workout_Type ~ Age + BMI + Max_BPM + Weight_kg + Height_m + Avg_BPM + Resting_BPM + 
                             Session_Duration_hours + Calories_Burned + 
                             Fat_Percentage + Water_Intake_liters + 
                             Workout_Frequency_daysweek + Gender + Experience_Level, data = silownia_rpart, method = "anova", na.action = na.exclude)

silownia_rpart$Workout_Type[is.na(silownia_rpart$Workout_Type)] <- predict(drzewo_decyzyjne1, newdata = silownia_rpart[is.na(silownia_rpart$Workout_Type), ])


drzewo_decyzyjne2 <- rpart(Age ~ BMI + Workout_Type + Gender + Max_BPM + Weight_kg + Height_m + Avg_BPM + Resting_BPM + 
                             Session_Duration_hours + Calories_Burned + 
                             Fat_Percentage + Water_Intake_liters + 
                             Workout_Frequency_daysweek + Experience_Level, data = silownia_rpart, method = "anova", na.action = na.exclude)
silownia_rpart$Age[is.na(silownia_rpart$Age)] <- predict(drzewo_decyzyjne2, newdata = silownia_rpart[is.na(silownia_rpart$Age), ])

Wybór metody

Zdecydowaliśmy się zastąpić braki danych występujące w kolumnach Age i Workout_Type za pomocą metody hot-deck.

4. Walidacja danych

Kolejnym krokiem w procesie przygotownia danych do analizy jest jest oczyszczenie naszego zbioru z “brudnych danych”.

Age

Wartości w kolumnie Age muszą być większe od 0, mniejsze od 110 oraz są liczbą.

Gender

Kolumna gender przyjmuje wartość Female albo Male.

Weight

Wartości muszą być liczbami większymi od 40 i mniejszymi od 140.

Height

Wartości w kolumnie Height muszą być większe od 1,3, mniejsze od 2,15 oraz są liczbą.

MaxBPM

Kolumna MaxBPM musi posiadać wartości, które znajdują się w przedziele zamkniętym od 110 do 210 oraz są liczbą.

AvgBPM

Kolumna AvgBPM musi posiadać wartości które znajdują sie w przedziele zamkniętym od 80 do 180 oraz są liczbą.

RestingBPM

Kolumna RestingBPM musi posiadać wartości które są większe od 45, a mniejsze od 130 oraz są liczbą.

Session Durations

Wartości w kolumnie Session Durations muszą być liczbami dodatnimi mniejszymi od 2.

Calories Burned

Wartości muszą byc liczbami dodatnimi, mniejszymi od 2000.

Workout Type

Kolumna Workout_Type zawiera tylko takie wartości jak: Yoga, Cardio, HIIT oraz Strength.

Fat Percentage

Wartości w kolumnie Fat Percentage muszą być liczbami dodatnimi, mniejszeymi od 50.

Water Intakes

Wartości muszą byc dodatnie, mniejsze od 4 oraz są liczbą.

Workout Frequency

Kolumna Workout Frequency zawiera tylko takie wartości jak: 0, 1, 2, 3, 4, 5, 6, 7.

Experience Level

Kolumna Experience Level zawiera tylko takie wartości jak: 0, 1, 2, 3.

BMI

W naszym zbiorze danych nie wystąpiły żadne błędy, więc jest on gotowy do przeprowadzenie wizualizacji oraz dalszej analizy.

Wizualizacja danych

Analiza opisowa

Wnioskowanie

Podsumowanie